/*
 * @FileName: boot.h
 * @Author: GreyQiu qiushaogui@aikosolar.com
 * @Date: 2023-07-13 15:53:50
 * @LastEditors: GreyQiu qiushaogui@aikosolar.com
 * @LastEditTime: 2023-08-23 15:51:19
 * @Description: 
 * 本模块实现在芯片flash中模拟eeprom
 * 注意！！ 本模块对上层应用屏蔽了EEPROM在FLASH中的具体位置
 * 用户仅认为eeprom基地址从0开始以及大小即可，无需考FLASH中的实际位置
 * 
 * Copyright (c) 2023, All Rights Reserved. 
 */
#ifndef __BSP_EEPROM_H__
#define __BSP_EEPROM_H__

#include "n32g430.h"

/**
 * @description EEPROM操作结果
 */
typedef enum
{
    APP_FLASH_NONE = 0,
    APP_FLASH_BUSY = 1,  // 操作忙
    APP_FLASH_ERR_PG,    // 编程错误
    APP_FLASH_ERR_WRP,   // 写保护
    APP_FLASH_SUCCESS,   // 操作成功
    APP_FLASH_ERR_RDP,   // 读保护
    APP_FLASH_ERR_ADD,   // 非法地址
    APP_FLASH_TIMEOUT    // 操作超时
} flash_sts_t;

#define FLASH_BASE_ADDR     (0x08000000)    // 芯片FLASH基址
#define FLASH_PAGE_SIZE     (2048)          // FLASH每个PAGE大小为2KB
#define FLASH_PAGE_NUM      (32)            // FLASH共有32个PAGE
#define FLASH_WORD_SIZE     (4)             // FLASH仅支持4字节编程

#define APP_BASE_ADDR    (FLASH_BASE_ADDR + FLASH_PAGE_SIZE * 5) // APP的地址，从第5页开始，地址为0x08002800
#define APP_SIZE         (FLASH_PAGE_SIZE * 1) // 大小1个PAGE

flash_sts_t app_flash_page_erase(uint32_t address);
flash_sts_t app_flash_write(uint32_t address, uint8_t * pData, uint32_t byteSize);
flash_sts_t app_flash_read(uint32_t address, uint8_t * pData, uint32_t wordSize);

#endif
